前言
前面六天的重點都是對於 ASP .NET Core 一些最基本的設定、管理與應用的知識,今天要進入對 ASP .NET Core內重點之一的內容,慢慢會發現,其實從第二天內容到今天,都是息息相關的。這也是我覺得先了解這些底層原理設定,對於學習 ASP .NET Core 才是比較妥當的,這主題會先從生命週期運作分享,然後再加入 Middleware 。
分享主軸
簡易畫一張圖供參考 :
HTTP Request
|
v
Web Server (IIS, Nginx, etc. 反向代理伺服器)
|
v
Kestrel (ASP.NET Core 內建伺服器)
|
v
Middleware Pipeline
|
v
Routing
|
v
Controller
|
v
Action Method
|
v
Generate Response
|
v
Middleware Pipeline (返回)
|
v
Kestrel
|
v
Web Server
|
v
HTTP Response
上圖簡易說明 :
專門處理 ASP.NET Core 底層工作:Middleware 負責處理所有 HTTP 的請求(Request)與回應(Response)。
Middleware 的限制:Middleware 是底層的,因此無法直接接觸到 MVC 那層(應用層)的東西
如下程式碼所示範
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
// Middleware 1
app.Use(async (context, next) =>
{
Console.WriteLine("1");
await next();
Console.WriteLine("2");
});
// Middleware 2
app.Use(async (context, next) =>
{
Console.WriteLine("3");
await next();
Console.WriteLine("4");
});
// Middleware 3
app.Use(async (context, next) =>
{
Console.WriteLine("5");
await next();
Console.WriteLine("6");
});
// 終端 Middleware
app.Run(async context =>
{
Console.WriteLine("終端Middleware");
await context.Response.WriteAsync("Hello, World!");
});
app.Run();
由上方結果得出順序會是 1 -> 3 -> 5 -> 終端Middleware -> 6 -> 4 -> 2
每一個 Middleware 遇到 next() 時,會暫停並跳到下一個 Middleware 執行,然後再回到上一個 Middleware 繼續執行。
Middleware內的 app.Use 是指定義 Middleware 元件,app.Map 是用來定義特定路徑的 Middleware 或自訂義路由,app.Run 是用來實作請求管道中的終端 Middleware。
所有 Middleware 包括 app.Use 和 app.Map 定義的 Middleware 都有順序性,只是 app.Map 定義的 Middleware 只會在特定路徑執行。
簡單統整一下今日重點
今日結語
今天對於 ASP .NET Core 的 Middleware 做一個了解學習,包括代表生命週期與代表意思、執行順序等等。
明天會針對如何自己寫一個簡單 Middleware 去做示範分享。
今天分享到這邊,希望對大家有所幫助,謝謝,明天繼續加油努力!